package main

import (
	"fmt"
	"time"
)

func main() {
	ch := make(chan string)
	okch := make(chan bool)
	// 使用chan来阻塞直到完成
	isDone := func() bool {
		return <-okch
	}

	// 先defer close, 否则报错: panic: send on closed channel
	// defer close(okch)
	defer func() {
		okch <- true
		close(okch)
	}()

	go setData(ch)
	go getData(ch, isDone)
	// 阻塞main, 直到okch可以写入
}

func setData(ch chan string) {
	ch <- "golang"
	ch <- "java"
	ch <- "python"
	ch <- "rust"
	// 不主动关闭则会dealock
	close(ch)
}

func getData(ch chan string, isDone func() bool) {
	time.Sleep(2e9)
	// 解释一下为什么如果在函数 getData() 的一开始插入 time.Sleep(2e9)，不会出现错误但也没有输出呢。
	// 还没有开始接收main程序就结束了, 所以没有输出了

	for {
		// 需要主动关闭ch, ok才会为false
		input, ok := <-ch
		if !ok {
			break
		}
		fmt.Println(input)
	}
	isDone()
}
